From 23762e4586127ede32dcbffe94301635e5897d28 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 12 Jun 2015 17:37:19 -0700 Subject: [PATCH] Move Cargo onto stable Rust This commit moves Cargo onto 100% stable Rust now that the necessary fs features have been stabilized. The tests were updated to understand when they're running with a non-nightly compiler and disable all plugin-related tests. The only major feature here is that the calls to `fs::set_file_times` were reimplemented manually in the tests that Cargo has. Cargo still requires a *nightly compiler* due to the stable features not having made their way into the stable channel yet, but it will soon work on all of the stable, beta, and nightly compilers once 1.1 is released! --- Cargo.lock | 8 +- Cargo.toml | 3 +- src/bin/cargo.rs | 2 - src/cargo/lib.rs | 1 - src/rustversion.txt | 2 +- tests/support/mod.rs | 2 +- tests/support/paths.rs | 118 +++++++++++++++++++--- tests/test_cargo_bench.rs | 123 ++++++++++++----------- tests/test_cargo_compile_custom_build.rs | 6 +- tests/test_cargo_compile_plugins.rs | 4 + tests/test_cargo_cross_compile.rs | 4 +- tests/test_cargo_new.rs | 5 +- tests/test_cargo_run.rs | 3 +- tests/test_cargo_test.rs | 1 - tests/tests.rs | 17 +++- 15 files changed, 197 insertions(+), 102 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ec49c24f4..c8dedb653 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,7 +7,7 @@ dependencies = [ "curl 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "docopt 0.6.64 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "filetime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "filetime 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "git2 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "git2-curl 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -22,7 +22,7 @@ dependencies = [ "registry 0.1.0", "rustc-serialize 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", - "tar 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tar 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "threadpool 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -94,7 +94,7 @@ dependencies = [ [[package]] name = "filetime" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -289,7 +289,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "tar" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index f5ae50edd..094424d8f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ curl = "0.2" docopt = "0.6" env_logger = "0.3" flate2 = "0.2" -git2 = { version = "0.2", features = ["unstable"] } +git2 = "0.2" git2-curl = "0.2" glob = "0.2" libc = "0.1" @@ -42,6 +42,7 @@ dependencies = { winapi = "0.1", advapi32-sys = "0.1", kernel32-sys = "0.1" } tempdir = "0.3" hamcrest = { git = "https://github.com/carllerche/hamcrest-rust.git" } bufstream = "0.1" +filetime = "0.1" [[bin]] name = "cargo" diff --git a/src/bin/cargo.rs b/src/bin/cargo.rs index f6146c623..0e5318b49 100644 --- a/src/bin/cargo.rs +++ b/src/bin/cargo.rs @@ -1,5 +1,3 @@ -#![cfg_attr(unix, feature(fs_ext))] - extern crate cargo; extern crate env_logger; extern crate git2_curl; diff --git a/src/cargo/lib.rs b/src/cargo/lib.rs index e5c572457..fde0b9bc2 100644 --- a/src/cargo/lib.rs +++ b/src/cargo/lib.rs @@ -1,5 +1,4 @@ #![deny(unused)] -#![feature(file_type, dir_entry_ext)] #![cfg_attr(test, deny(warnings))] #[cfg(test)] extern crate hamcrest; diff --git a/src/rustversion.txt b/src/rustversion.txt index 1c6937580..298ea48f8 100644 --- a/src/rustversion.txt +++ b/src/rustversion.txt @@ -1 +1 @@ -2015-05-29 +2015-06-13 diff --git a/tests/support/mod.rs b/tests/support/mod.rs index fce7fd199..6b013eef2 100644 --- a/tests/support/mod.rs +++ b/tests/support/mod.rs @@ -191,7 +191,7 @@ impl ProjectBuilder { } fn rm_root(&self) -> Result<(), String> { - if self.root.exists() { + if self.root.c_exists() { rmdir_recursive(&self.root) } else { Ok(()) diff --git a/tests/support/paths.rs b/tests/support/paths.rs index 970ac00d1..e3bad5ce1 100644 --- a/tests/support/paths.rs +++ b/tests/support/paths.rs @@ -6,6 +6,8 @@ use std::path::{Path, PathBuf}; use std::sync::{Once, ONCE_INIT}; use std::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering}; +use filetime::FileTime; + static CARGO_INTEGRATION_TEST_DIR : &'static str = "cit"; static NEXT_ID: AtomicUsize = ATOMIC_USIZE_INIT; thread_local!(static TASK_ID: usize = NEXT_ID.fetch_add(1, Ordering::SeqCst)); @@ -27,6 +29,12 @@ pub trait CargoPathExt { fn rm_rf(&self) -> io::Result<()>; fn mkdir_p(&self) -> io::Result<()>; fn move_into_the_past(&self) -> io::Result<()>; + + // cargo versions of the standard PathExt trait + fn c_exists(&self) -> bool; + fn c_is_file(&self) -> bool; + fn c_is_dir(&self) -> bool; + fn c_metadata(&self) -> io::Result; } impl CargoPathExt for Path { @@ -34,11 +42,11 @@ impl CargoPathExt for Path { * care all that much for our tests */ fn rm_rf(&self) -> io::Result<()> { - if self.exists() { + if self.c_exists() { for file in fs::read_dir(self).unwrap() { let file = try!(file).path(); - if file.is_dir() { + if file.c_is_dir() { try!(file.rm_rf()); } else { // On windows we can't remove a readonly file, and git will @@ -48,7 +56,7 @@ impl CargoPathExt for Path { Ok(()) => {} Err(ref e) if cfg!(windows) && e.kind() == ErrorKind::PermissionDenied => { - let mut p = file.metadata().unwrap().permissions(); + let mut p = file.c_metadata().unwrap().permissions(); p.set_readonly(false); fs::set_permissions(&file, p).unwrap(); try!(fs::remove_file(&file)); @@ -68,37 +76,115 @@ impl CargoPathExt for Path { } fn move_into_the_past(&self) -> io::Result<()> { - if self.is_file() { + if self.c_is_file() { try!(time_travel(self)); } else { - let target = self.join("target"); - for f in try!(fs::walk_dir(self)) { - let f = try!(f).path(); - if f.starts_with(&target) { continue } - if !f.is_file() { continue } - try!(time_travel(&f)); - } + try!(recurse(self, &self.join("target"))); } return Ok(()); + fn recurse(p: &Path, bad: &Path) -> io::Result<()> { + if p.c_is_file() { + time_travel(p) + } else if p.starts_with(bad) { + Ok(()) + } else { + for f in try!(fs::read_dir(p)) { + let f = try!(f).path(); + try!(recurse(&f, bad)); + } + Ok(()) + } + } + fn time_travel(path: &Path) -> io::Result<()> { - let stat = try!(path.metadata()); + let stat = try!(path.c_metadata()); - let hour = 1000 * 3600; - let newtime = stat.modified() - hour; + let mtime = FileTime::from_last_modification_time(&stat); + let newtime = mtime.seconds() - 3600; // Sadly change_file_times has a failure mode where a readonly file // cannot have its times changed on windows. - match fs::set_file_times(path, newtime, newtime) { + match set_file_times(path, newtime, newtime) { Err(ref e) if e.kind() == io::ErrorKind::PermissionDenied => {} e => return e, } let mut perms = stat.permissions(); perms.set_readonly(false); try!(fs::set_permissions(path, perms)); - fs::set_file_times(path, newtime, newtime) + set_file_times(path, newtime, newtime) + } + + #[cfg(unix)] + fn set_file_times(p: &Path, atime: u64, mtime: u64) -> io::Result<()> { + use std::os::unix::prelude::*; + use std::ffi::CString; + use libc::{timeval, time_t, c_char, c_int}; + + let p = try!(CString::new(p.as_os_str().as_bytes())); + let atime = timeval { tv_sec: atime as time_t, tv_usec: 0, }; + let mtime = timeval { tv_sec: mtime as time_t, tv_usec: 0, }; + let times = [atime, mtime]; + extern { + fn utimes(name: *const c_char, times: *const timeval) -> c_int; + } + unsafe { + if utimes(p.as_ptr(), times.as_ptr()) == 0 { + Ok(()) + } else { + Err(io::Error::last_os_error()) + } + } + } + + #[cfg(windows)] + fn set_file_times(p: &Path, atime: u64, mtime: u64) -> io::Result<()> { + use std::fs::OpenOptions; + use std::os::windows::prelude::*; + use winapi::{FILETIME, DWORD}; + use kernel32; + + let f = try!(OpenOptions::new().write(true).open(p)); + let atime = to_filetime(atime); + let mtime = to_filetime(mtime); + return unsafe { + let ret = kernel32::SetFileTime(f.as_raw_handle() as *mut _, + 0 as *const _, + &atime, &mtime); + if ret != 0 { + Ok(()) + } else { + Err(io::Error::last_os_error()) + } + }; + + fn to_filetime(seconds: u64) -> FILETIME { + // FILETIME is a count of 100ns intervals, and there are 10^7 of + // these in a second + let seconds = seconds * 10_000_000; + FILETIME { + dwLowDateTime: seconds as DWORD, + dwHighDateTime: (seconds >> 32) as DWORD, + } + } } } + + fn c_exists(&self) -> bool { + fs::metadata(self).is_ok() + } + + fn c_is_file(&self) -> bool { + fs::metadata(self).map(|m| m.is_file()).unwrap_or(false) + } + + fn c_is_dir(&self) -> bool { + fs::metadata(self).map(|m| m.is_dir()).unwrap_or(false) + } + + fn c_metadata(&self) -> io::Result { + fs::metadata(self) + } } /// Ensure required test directories exist and are empty diff --git a/tests/test_cargo_bench.rs b/tests/test_cargo_bench.rs index 7c5dba752..4c3a9f19d 100644 --- a/tests/test_cargo_bench.rs +++ b/tests/test_cargo_bench.rs @@ -9,6 +9,8 @@ use cargo::util::process; fn setup() {} test!(cargo_bench_simple { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", &basic_bin_manifest("foo")) .file("src/foo.rs", r#" @@ -40,7 +42,7 @@ test!(cargo_bench_simple { {} target[..]release[..]foo-[..] running 1 test -test bench_hello ... bench: 0 ns/iter (+/- 0) +test bench_hello ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -50,6 +52,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured }); test!(bench_tarname { + if !::is_nightly() { return } + let prj = project("foo") .file("Cargo.toml" , r#" [package] @@ -71,7 +75,7 @@ test!(bench_tarname { {running} target[..]release[..]bin2[..] running 1 test -test run2 ... bench: 0 ns/iter (+/- 0) +test run2 ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -85,6 +89,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured }); test!(cargo_bench_verbose { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", &basic_bin_manifest("foo")) .file("src/foo.rs", r#" @@ -101,7 +107,7 @@ test!(cargo_bench_verbose { {running} `[..]target[..]release[..]foo-[..] hello --bench` running 1 test -test bench_hello ... bench: 0 ns/iter (+/- 0) +test bench_hello ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -110,6 +116,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured }); test!(many_similar_names { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", r#" [package] @@ -145,6 +153,8 @@ test!(many_similar_names { }); test!(cargo_bench_failing_test { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", &basic_bin_manifest("foo")) .file("src/foo.rs", r#" @@ -187,6 +197,8 @@ thread '
' panicked at 'assertion failed: \ }); test!(bench_with_lib_dep { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", r#" [project] @@ -229,14 +241,14 @@ test!(bench_with_lib_dep { {running} target[..]release[..]baz-[..] running 1 test -test bin_bench ... bench: 0 ns/iter (+/- 0) +test bin_bench ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured {running} target[..]release[..]foo-[..] running 1 test -test lib_bench ... bench: 0 ns/iter (+/- 0) +test lib_bench ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -245,6 +257,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured }); test!(bench_with_deep_lib_dep { + if !::is_nightly() { return } + let p = project("bar") .file("Cargo.toml", r#" [package] @@ -290,7 +304,7 @@ test!(bench_with_deep_lib_dep { {running} target[..] running 1 test -test bar_bench ... bench: 0 ns/iter (+/- 0) +test bar_bench ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -300,6 +314,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured }); test!(external_bench_explicit { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", r#" [project] @@ -334,14 +350,14 @@ test!(external_bench_explicit { {running} target[..]release[..]bench-[..] running 1 test -test external_bench ... bench: 0 ns/iter (+/- 0) +test external_bench ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured {running} target[..]release[..]foo-[..] running 1 test -test internal_bench ... bench: 0 ns/iter (+/- 0) +test internal_bench ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -350,6 +366,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured }); test!(external_bench_implicit { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", r#" [project] @@ -381,14 +399,14 @@ test!(external_bench_implicit { {running} target[..]release[..]external-[..] running 1 test -test external_bench ... bench: 0 ns/iter (+/- 0) +test external_bench ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured {running} target[..]release[..]foo-[..] running 1 test -test internal_bench ... bench: 0 ns/iter (+/- 0) +test internal_bench ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -397,6 +415,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured }); test!(dont_run_examples { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", r#" [project] @@ -414,6 +434,8 @@ test!(dont_run_examples { }); test!(pass_through_command_line { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", r#" [package] @@ -436,7 +458,7 @@ test!(pass_through_command_line { {running} target[..]release[..]foo-[..] running 1 test -test bar ... bench: 0 ns/iter (+/- 0) +test bar ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -450,7 +472,7 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured {running} target[..]release[..]foo-[..] running 1 test -test foo ... bench: 0 ns/iter (+/- 0) +test foo ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -460,6 +482,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured // Regression test for running cargo-bench twice with // tests in an rlib test!(cargo_bench_twice { + if !::is_nightly() { return } + let p = project("test_twice") .file("Cargo.toml", &basic_lib_manifest("test_twice")) .file("src/test_twice.rs", r#" @@ -481,6 +505,8 @@ test!(cargo_bench_twice { }); test!(lib_bin_same_name { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", r#" [project] @@ -513,14 +539,14 @@ test!(lib_bin_same_name { {running} target[..]release[..]foo-[..] running 1 test -test [..] ... bench: 0 ns/iter (+/- 0) +test [..] ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured {running} target[..]release[..]foo-[..] running 1 test -test [..] ... bench: 0 ns/iter (+/- 0) +test [..] ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -529,6 +555,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured }); test!(lib_with_standard_name { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", r#" [package] @@ -564,14 +592,14 @@ test!(lib_with_standard_name { {running} target[..]release[..]bench-[..] running 1 test -test bench ... bench: 0 ns/iter (+/- 0) +test bench ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured {running} target[..]release[..]syntax-[..] running 1 test -test foo_bench ... bench: 0 ns/iter (+/- 0) +test foo_bench ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -581,6 +609,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured }); test!(lib_with_standard_name2 { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", r#" [package] @@ -614,7 +644,7 @@ test!(lib_with_standard_name2 { {running} target[..]release[..]syntax-[..] running 1 test -test bench ... bench: 0 ns/iter (+/- 0) +test bench ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -623,42 +653,9 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured dir = p.url()))); }); -test!(bin_there_for_integration { - let p = project("foo") - .file("Cargo.toml", r#" - [package] - name = "foo" - version = "0.0.1" - authors = [] - "#) - .file("src/main.rs", " - #![feature(test)] - extern crate test; - fn main() { panic!(); } - #[bench] fn main_bench(_b: &mut test::Bencher) {} - ") - .file("benches/foo.rs", r#" - #![feature(test)] - extern crate test; - use std::process::Command; - #[bench] - fn bench_bench(_b: &mut test::Bencher) { - let status = Command::new("target/release/foo").status().unwrap(); - assert_eq!(status.code(), Some(101)); - } - "#); - - let output = p.cargo_process("bench").arg("-v").exec_with_output().unwrap(); - let output = str::from_utf8(&output.stdout).unwrap(); - assert!(output.contains("main_bench ... bench: 0 ns/iter (+/- 0)"), - "no main_bench\n{}", - output); - assert!(output.contains("bench_bench ... bench: 0 ns/iter (+/- 0)"), - "no bench_bench\n{}", - output); -}); - test!(bench_dylib { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", r#" [package] @@ -717,14 +714,14 @@ test!(bench_dylib { {running} [..]target[..]release[..]bench-[..] running 1 test -test foo ... bench: 0 ns/iter (+/- 0) +test foo ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured {running} [..]target[..]release[..]foo-[..] running 1 test -test foo ... bench: 0 ns/iter (+/- 0) +test foo ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -740,14 +737,14 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured {running} [..]target[..]release[..]bench-[..] running 1 test -test foo ... bench: 0 ns/iter (+/- 0) +test foo ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured {running} [..]target[..]release[..]foo-[..] running 1 test -test foo ... bench: 0 ns/iter (+/- 0) +test foo ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -757,6 +754,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured }); test!(bench_twice_with_build_cmd { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", r#" [package] @@ -780,7 +779,7 @@ test!(bench_twice_with_build_cmd { {running} target[..]release[..]foo-[..] running 1 test -test foo ... bench: 0 ns/iter (+/- 0) +test foo ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -794,7 +793,7 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured {running} target[..]release[..]foo-[..] running 1 test -test foo ... bench: 0 ns/iter (+/- 0) +test foo ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -803,6 +802,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured }); test!(bench_with_examples { + if !::is_nightly() { return } + let p = project("testbench") .file("Cargo.toml", r#" [package] @@ -864,14 +865,14 @@ test!(bench_with_examples { {running} `{dir}[..]target[..]release[..]testb1-[..] --bench` running 1 test -test bench_bench2 ... bench: 0 ns/iter (+/- 0) +test bench_bench2 ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured {running} `{dir}[..]target[..]release[..]testbench-[..] --bench` running 1 test -test bench_bench1 ... bench: 0 ns/iter (+/- 0) +test bench_bench1 ... bench: [..] 0 ns/iter (+/- 0) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured @@ -883,6 +884,8 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured }); test!(test_a_bench { + if !::is_nightly() { return } + let p = project("foo") .file("Cargo.toml", r#" [project] diff --git a/tests/test_cargo_compile_custom_build.rs b/tests/test_cargo_compile_custom_build.rs index 4794bbcb6..28aed813b 100644 --- a/tests/test_cargo_compile_custom_build.rs +++ b/tests/test_cargo_compile_custom_build.rs @@ -24,9 +24,8 @@ test!(custom_build_script_failed { fn main() {} "#) .file("build.rs", r#" - #![feature(exit_status)] fn main() { - std::env::set_exit_status(101); + std::process::exit(101); } "#); assert_that(p.cargo_process("build").arg("-v"), @@ -891,7 +890,6 @@ test!(code_generation { } "#) .file("build.rs", r#" - #![feature(convert)] use std::env; use std::fs::File; use std::io::prelude::*; @@ -1059,7 +1057,6 @@ test!(test_a_lib_with_a_build_command { } "#) .file("build.rs", r#" - #![feature(convert)] use std::env; use std::io::prelude::*; use std::fs::File; @@ -1153,7 +1150,6 @@ test!(build_script_with_dynamic_native_dependency { build = "build.rs" "#) .file("bar/build.rs", r#" - #![feature(convert)] use std::env; use std::path::PathBuf; diff --git a/tests/test_cargo_compile_plugins.rs b/tests/test_cargo_compile_plugins.rs index c1a462c0d..01011e5b4 100644 --- a/tests/test_cargo_compile_plugins.rs +++ b/tests/test_cargo_compile_plugins.rs @@ -9,6 +9,8 @@ fn setup() { } test!(plugin_to_the_max { + if !::is_nightly() { return } + let foo = project("foo") .file("Cargo.toml", r#" [package] @@ -84,6 +86,8 @@ test!(plugin_to_the_max { }); test!(plugin_with_dynamic_native_dependency { + if !::is_nightly() { return } + let build = project("builder") .file("Cargo.toml", r#" [package] diff --git a/tests/test_cargo_cross_compile.rs b/tests/test_cargo_cross_compile.rs index 57bdd59fa..2a35a8d22 100644 --- a/tests/test_cargo_cross_compile.rs +++ b/tests/test_cargo_cross_compile.rs @@ -99,6 +99,7 @@ test!(simple_deps { test!(plugin_deps { if disabled() { return } + if !::is_nightly() { return } let foo = project("foo") .file("Cargo.toml", r#" @@ -175,6 +176,7 @@ test!(plugin_deps { test!(plugin_to_the_max { if disabled() { return } + if !::is_nightly() { return } let foo = project("foo") .file("Cargo.toml", r#" @@ -298,6 +300,7 @@ test!(linker_and_ar { test!(plugin_with_extra_dylib_dep { if disabled() { return } + if !::is_nightly() { return } let foo = project("foo") .file("Cargo.toml", r#" @@ -453,7 +456,6 @@ test!(cross_with_a_build_script { build = 'build.rs' "#) .file("build.rs", &format!(r#" - #![feature(convert)] use std::env; use std::path::PathBuf; fn main() {{ diff --git a/tests/test_cargo_new.rs b/tests/test_cargo_new.rs index c315afb2f..b885a49fc 100644 --- a/tests/test_cargo_new.rs +++ b/tests/test_cargo_new.rs @@ -4,6 +4,7 @@ use std::env; use tempdir::TempDir; use support::{execs, paths, cargo_dir}; +use support::paths::CargoPathExt; use hamcrest::{assert_that, existing_file, existing_dir, is_not}; use cargo::util::{process, ProcessBuilder}; @@ -203,7 +204,7 @@ test!(author_prefers_cargo { let mut contents = String::new(); File::open(&toml).unwrap().read_to_string(&mut contents).unwrap(); assert!(contents.contains(r#"authors = ["new-foo "]"#)); - assert!(!root.join("foo/.gitignore").exists()); + assert!(!root.join("foo/.gitignore").c_exists()); }); test!(git_prefers_command_line { @@ -221,7 +222,7 @@ test!(git_prefers_command_line { .cwd(td.path()) .env("USER", "foo"), execs().with_status(0)); - assert!(td.path().join("foo/.gitignore").exists()); + assert!(td.path().join("foo/.gitignore").c_exists()); }); test!(subpackage_no_git { diff --git a/tests/test_cargo_run.rs b/tests/test_cargo_run.rs index 616eb3313..9275ce380 100644 --- a/tests/test_cargo_run.rs +++ b/tests/test_cargo_run.rs @@ -60,8 +60,7 @@ test!(exit_code { authors = [] "#) .file("src/main.rs", r#" - #![feature(exit_status)] - fn main() { std::env::set_exit_status(2); } + fn main() { std::process::exit(2); } "#); assert_that(p.cargo_process("run"), diff --git a/tests/test_cargo_test.rs b/tests/test_cargo_test.rs index 534890313..876cd8d58 100644 --- a/tests/test_cargo_test.rs +++ b/tests/test_cargo_test.rs @@ -1206,7 +1206,6 @@ test!(example_dev_dep { authors = [] "#) .file("bar/src/lib.rs", r#" - #![feature(macro_rules)] // make sure this file takes awhile to compile macro_rules! f0( () => (1) ); macro_rules! f1( () => ({(f0!()) + (f0!())}) ); diff --git a/tests/tests.rs b/tests/tests.rs index 59b5b4c58..6aba35471 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -1,15 +1,17 @@ -#![feature(fs, fs_ext, path_ext, fs_time, fs_walk)] - -extern crate rustc_serialize; +extern crate bufstream; extern crate cargo; +extern crate filetime; extern crate flate2; extern crate git2; -extern crate bufstream; extern crate hamcrest; +extern crate libc; +extern crate rustc_serialize; extern crate tar; +extern crate tempdir; extern crate term; extern crate url; -extern crate tempdir; +#[cfg(windows)] extern crate kernel32; +#[cfg(windows)] extern crate winapi; #[macro_use] extern crate log; @@ -58,3 +60,8 @@ mod test_shell; fn rustc_host() -> String { cargo::ops::rustc_version("rustc").unwrap().1 } + +fn is_nightly() -> bool { + let version_info = cargo::ops::rustc_version("rustc").unwrap().0; + version_info.contains("-nightly") || version_info.contains("-dev") +} -- 2.30.2